package es.gesfutbol.web;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.criterion.Order;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IEquipDao;
import es.gesfutbol.dao.IEquipEnLligaDao;
import es.gesfutbol.dao.IJornadaDao;
import es.gesfutbol.dao.ILligaDao;
import es.gesfutbol.dao.IPartitDao;
import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.EquipEnLliga;
import es.gesfutbol.domini.implementacio.IdEquipEnLliga;
import es.gesfutbol.domini.implementacio.Jornada;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.domini.implementacio.Partit;
import es.gesfutbol.util.OrdenaEquipsEnLligaPerNomEquip;

public class EquipEnLligaController extends MultiActionController{

	private IPartitDao partitDao;
	private IJornadaDao jornadaDao;
	private ILligaDao lligaDao; 
	private IEquipDao equipDao;
	private IEquipEnLligaDao equipEnLligaDao;
	
	public IPartitDao getPartitDao() {
		return partitDao;
	}

	public void setPartitDao(IPartitDao partitDao) {
		this.partitDao =partitDao;
	}
	
	public IJornadaDao getJornadaDao() {
		return jornadaDao;
	}

	public void setJornadaDao(IJornadaDao jornadaDao) {
		this.jornadaDao = jornadaDao;
	}
	
	public ILligaDao getLligaDao(){
		return lligaDao;
	}
	
	public void setLligaDao(ILligaDao lligaDao){
		this.lligaDao = lligaDao;
	}
	
	public IEquipDao getEquipDao() {
		return equipDao;
	}

	public void setEquipDao(IEquipDao equipDao) {
		this.equipDao = equipDao;
	}
	
	public IEquipEnLligaDao getEquipEnLligaDao() {
		return equipEnLligaDao;
	}

	public void setEquipEnLligaDao(IEquipEnLligaDao equipEnLligaDao) {
		this.equipEnLligaDao = equipEnLligaDao;
	}
	
	/**
	 * Mètode que inicialitza la pàgina de lligues i envia la llista
	 * de lligues actuals a la vista.
	 * 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView init(HttpServletRequest request,
	HttpServletResponse response) throws Exception {

		Long idLliga = Long.parseLong(request.getParameter("idLliga"));
		Lliga lliga = lligaDao.findById(idLliga);
		
		List<Equip> equips = equipDao.findAll(Order.asc("nom"));
		
		List<EquipEnLliga> equipsEnLliga = equipEnLligaDao.findByIdLligaDeproxy(idLliga);
		
		if(equipsEnLliga != null) {
			Collections.sort(equipsEnLliga, new OrdenaEquipsEnLligaPerNomEquip());
		}
				
		EquipEnLliga equipEnLliga = new EquipEnLliga();
		IdEquipEnLliga idEquipEnLliga = new IdEquipEnLliga();
		idEquipEnLliga.setLliga(lliga);
		idEquipEnLliga.setEquip(new Equip());
		equipEnLliga.setId(idEquipEnLliga);		
		
		ModelMap modelMap = new ModelMap();
		modelMap.addAttribute("llistatEquipsEnLliga", equipsEnLliga);
		modelMap.addAttribute("lligaActual", lliga);
		modelMap.addAttribute("equipEnLliga", equipEnLliga);
		modelMap.addAttribute("llistatEquips", equips);
		return new ModelAndView("administracion/equipsEnLliga", modelMap);
	}
	
	@Transactional(readOnly = false)
	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response){

		Long idLliga= Long.parseLong(request.getParameter("idLliga"));
		Long idEquip = Long.parseLong(request.getParameter("idEquip"));
		EquipEnLliga equipEnLliga = equipEnLligaDao.findEquipEnLligaByEquipILliga(idEquip, idLliga);

		equipEnLligaDao.delete(equipEnLliga);

		return new ModelAndView("redirect:init.htm?idLliga=" + idLliga); 
	}
//	
//	/**
//	 * Mètode que guarda els canvis tant de l'afegir com l'editar
//	 * lliga.
//	 * 
//	 * @param request
//	 * @param response
//	 * @param equip
//	 * @return
//	 */
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, EquipEnLliga equipEnLliga){
		equipEnLligaDao.saveOrUpdate(equipEnLliga);
		return new ModelAndView("redirect:init.htm?idLliga=" + equipEnLliga.getId().getLliga().getIdLliga());
	}
	
	public ModelAndView updateClasif(HttpServletRequest request,
			HttpServletResponse response){
		
		Long idLliga= Long.parseLong(request.getParameter("idLliga"));
		Lliga lliga = lligaDao.findById(idLliga);
		lliga = lligaDao.deproxy(lliga);
		
		//Reset inicial de totes les dades abans de generar la nova classificacio
		List<EquipEnLliga> equipsLliga = equipEnLligaDao.findByIdLligaDeproxy(idLliga);
		Iterator<EquipEnLliga> itEquips = equipsLliga.iterator();
		while(itEquips.hasNext()){
			EquipEnLliga eell = itEquips.next();
			eell = equipEnLligaDao.resetEstadistica(eell);
			equipEnLligaDao.saveOrUpdate(eell);
		}
		
		Set<Jornada> jornades = lliga.getJornades();
		Iterator<Jornada> itJornades = jornades.iterator();
		Set<Jornada> jorn2 = new HashSet<Jornada>();
		
		while(itJornades.hasNext()){
			jorn2.add(jornadaDao.deproxy(itJornades.next()));
		}
		lliga.setJornades(jorn2);
		Iterator<Jornada> itJorn2 = jorn2.iterator();
		while(itJorn2.hasNext()){
			Set<Partit> partits = itJorn2.next().getPartits();
			partits = partitDao.deproxylist(partits);
			Iterator<Partit> itPartit = partits.iterator();
			while(itPartit.hasNext()){
				Partit partit = itPartit.next();
				Equip equipLocal = partit.getEquipLocal();
				Equip equipVisitant = partit.getEquipVisitant();
				
				if((partit.getGolsLocal() != null)&&(partit.getGolsVisitant() != null)){
					
					Integer golsLocal = partit.getGolsLocal();
					Integer golsVisitant = partit.getGolsVisitant();
					
					EquipEnLliga equipEnLligaLocal = equipEnLligaDao.findEquipEnLligaByEquipILliga(equipLocal.getIdEquip(), idLliga);
					EquipEnLliga equipEnLligaVisitant = equipEnLligaDao.findEquipEnLligaByEquipILliga(equipVisitant.getIdEquip(), idLliga);
												
					//Gols a Favor
					equipEnLligaLocal.setGolsAFavorTotals(equipEnLligaLocal.getGolsAFavorTotals() + golsLocal);
					equipEnLligaVisitant.setGolsAFavorTotals(equipEnLligaVisitant.getGolsAFavorTotals() + golsVisitant);
					//Gols En Contra
					equipEnLligaLocal.setGolsEnContraTotals(equipEnLligaLocal.getGolsEnContraTotals() + golsVisitant);
					equipEnLligaVisitant.setGolsEnContraTotals(equipEnLligaVisitant.getGolsEnContraTotals() + golsLocal);
					//Partits Jugats
					equipEnLligaLocal.setPartitsJugatsTotals(equipEnLligaLocal.getPartitsJugatsTotals() + 1);
					equipEnLligaVisitant.setPartitsJugatsTotals(equipEnLligaVisitant.getPartitsJugatsTotals() + 1);
					//Partits Guanyats, Empatats, Perduts, Puntuacio
					if(golsLocal > golsVisitant){
						equipEnLligaLocal.setPartitsGuanyatsTotals(equipEnLligaLocal.getPartitsGuanyatsTotals() + 1);
						equipEnLligaVisitant.setPartitsPerdutsTotals(equipEnLligaVisitant.getPartitsPerdutsTotals() + 1);
						equipEnLligaLocal.setPuntuacio(equipEnLligaLocal.getPuntuacio() + 3);
					}
					if(golsLocal == golsVisitant){
						equipEnLligaLocal.setPuntuacio(equipEnLligaLocal.getPuntuacio() + 1);
						equipEnLligaVisitant.setPuntuacio(equipEnLligaVisitant.getPuntuacio() + 1);
						equipEnLligaLocal.setPartitsEmpatatsTotals(equipEnLligaLocal.getPartitsEmpatatsTotals() + 1);
						equipEnLligaVisitant.setPartitsEmpatatsTotals(equipEnLligaVisitant.getPartitsEmpatatsTotals() + 1);
					}
					if(golsLocal < golsVisitant){
						equipEnLligaLocal.setPartitsPerdutsTotals(equipEnLligaLocal.getPartitsPerdutsTotals() + 1);
						equipEnLligaVisitant.setPartitsGuanyatsTotals(equipEnLligaVisitant.getPartitsGuanyatsTotals() + 1);
						equipEnLligaVisitant.setPuntuacio(equipEnLligaVisitant.getPuntuacio() + 3);					
					}
					equipEnLligaDao.saveOrUpdate(equipEnLligaLocal);
					equipEnLligaDao.saveOrUpdate(equipEnLligaVisitant);
				}
				
			}			
		}
		return new ModelAndView("redirect:init.htm?idLliga=" + lliga.getIdLliga());
		
	}
	


	
}
